package com.edgardleal.grafo;
public class MeioIntervalo {
	public double resolver(double inicio, double fim, double precisao) {
		Double m = Double.MAX_VALUE, // resultado
		fm = Double.MAX_VALUE;
		while(Math.abs(fm) > precisao) {
			m = Math.abs((inicio + fim) / 2);
			fm = f(m);
			inicio = f(fim) < 0 ? m : inicio;
			fim = f(inicio) < 0 ? m : fim;
		}
		System.out.println("Resultado : " + m);
		return m;
	}
	public double f(double valor) {
		return 2 * valor - 1;
	}
	public static void main(String arg[]) {
		new MeioIntervalo().resolver(-1, 1, 0.001);
	}
}

class MinimoQuadrado {
	Double valores[];
	public MinimoQuadrado(Double... valores) {
		this.valores = valores;
	}
	public Double[] resolver(double inicio, double fim, double precisao) {
		double a, b, minA = Double.MAX_VALUE, minB = Double.MAX_VALUE, somatorio = 0, somatorioMinimo = Double.MAX_VALUE;
		for (a = inicio; a <= fim; a += precisao)
			for (b = inicio; b <= fim; b += precisao) {
				somatorio = 0;
				for (int i = 0; i < valores.length; i++) {
					somatorio += funcaoQuadratica(i, valores[i], a, b);
				}
				if (somatorio < somatorioMinimo) {
					somatorioMinimo = somatorio;
					minA = a;
					minB = b;
				}
			}
		return new Double[] { minA, minB };
	}

	public double funcaoQuadratica(double x, double y, double a, double b) {
		return y - (a * x + Math.pow(b, 2));
	}

	public double funcaoDaReta(double a, double b, double x) {
		return a * x + b;
	}
	public double f(Double x) {
		return Math.pow(x, 2);
	}
}
